'use strict';
const JWT = require('jsonwebtoken');
const Controller = require('egg').Controller;
// 文件存储
const fs = require('fs');
const path = require('path');
const pump = require('mz-modules/pump');

class CommonController extends Controller {
  async login() {
    const { ctx, service } = this;
    ctx.state.user = null;
    const query = ctx.request.body;
    const validateReturn = await ctx.validate('user.login', query);
    if (!validateReturn) return 
    const result = await service[this.app.config.public].admin.system.common.login(query)
    if (!result) {
      return ctx.throw(500, '用户不存在');
    } else {
      let checkPwd = await ctx.compare(query.password, result.get('password'));
      // 校验密码compare（要比较的数据，加密码的数据）
      if (!checkPwd) {
        return ctx.throw(500, '用户名或密码错误')
      } else if (result.status === '0') {
        return ctx.throw(500, '该用户已经被停用！');
      } else {
        const token = JWT.sign({
          id: result.id,
          userName: result.userName
        },
          this.config.jwt.secret, {
          expiresIn: this.config.jwt.expiresIn,
        })
        ctx.state = {
          user: result
        };
        ctx.returnBody({
          userInfo: result,
          token
        });
      }
    }
  }
  
  // 登出
  async logout() {
    this.ctx.state.user = {}
    this.ctx.returnBody(null,0)
  }
  // 重置密码
  async resetPwd() {
    const { ctx, service } = this;
    let validate = Object.assign({}, ctx.request.body, ctx.params)
    const validateResult = await this.ctx.validate('user.resetPwd', validate)
    if (!validateResult) return
    ctx.request.body['newPassword'] = await ctx.genHash(ctx.request.body['newPassword'])
    let query = {password: ctx.request.body['newPassword']}
    let id = ctx.helper.parseInt(ctx.params.id)
    const result = await service[this.app.config.public].admin.system.user.resetPwd(query,id)
    if(result) {
      ctx.returnBody(null, 100030);
    }else{
      ctx.returnBody(null, 100031, 500);
    }
  }

  // 修改头像
  

  // 上传图片
  async upImg() {
    // 解析表单数据的方法
    // 懒解析：只有在主动调用时, 比如this.multipart, 才会解析multipart 请求。
    // autoFields:自增
    let parts = this.ctx.multipart({ autoFields: true });
    // 图片访问地址集合
    let stream, img_list = [];
    // 获取文件的信息
    // stream = await parts()
    //  表单数据除了附件以外的其他信息
    // var params = parts.field
    while ((stream = await parts()) != null) {
      if (!stream.filename) { break; }
      // 文件名为：时间戳+随机字符串+.文件后缀
      // extname可以获取文件的扩展名
      let filename = (new Date()).getTime() + Math.random().toString(36).substr(2) + path.extname(stream.filename).toLocaleLowerCase();
      // substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
      // 发现生成的是随机16/17位小数?
      // 通过toString（36）后发现小数点后的数字转为0·9a·z的值
      // toLocaleLowerCase：把字符串变成小写
      // 上传图片的目录
      let target = 'app/public/v1/admin/upload/' + filename;
      img_list.push('/public/v1/admin/upload/' + filename);
      let writeStream = fs.createWriteStream(target);
      // fs.createWriteStream:写入文件
      // createWriteStream 穿件一个写文件流的方法 可以将文件写入本地文件中
      // createReadStream 读取文件内容的方法
      await pump(stream, writeStream);
      // pump()方法使用以下语法将可读流写入可写流
    }
    // console.log(parts.field) // 表单其他数据，可以根据需要处理
    console.log(img_list);
    this.ctx.body = {
      url: 'http://127.0.0.1:7001' + img_list,
      fields: parts.field
    }

  }
}

module.exports = CommonController;